import router from "../router"
import cp from '../config/permission'
import store from '../store'
import myFns from '../utils/myFns'
import { validateToken } from '@/api/admin'

// 全局前置守卫
// https://v3.router.vuejs.org/zh/guide/advanced/navigation-guards.html
router.beforeEach((to, from, next) => {
    myFns.clog('[路由守卫] 当前页面', JSON.stringify(to.path))
    myFns.clog('[路由守卫] 当前token', JSON.stringify(store.getters.getToken))
    // myFns.clog('[路由守卫] 免登录路径', JSON.stringify(cp.pagesWithoutLogin))

    if (store.getters.getToken) {
        myFns.clog('[路由守卫] 已登录')
        // 已登录时不可访问的页面
        if (cp.pagesForbiddenLogin.indexOf(to.path) !== -1) {
            myFns.clog('[路由守卫] 已登录 > 禁止访问 > 跳转' + cp.pageForbiddenLoginRedirect)
            next(cp.pageForbiddenLoginRedirect)
        } else {
            // 某些页面需要实时核实token是否伪造
            if (cp.pagesDoubleCheckToken.indexOf(to.path) !== -1) {
                myFns.clog('[路由守卫] 已登录 > 需要再次核实token有效性')
                // vue-router实现异步跳转
                // https://blog.csdn.net/qq_36733466/article/details/140138789
                return new Promise(async (resolve, reject) => {
                    validateToken().then(isValid => {
                        // 查询成功
                        myFns.clog('[路由守卫] 已登录 > 需要再次核实token有效性 > 查询成功')
                        if (isValid) {
                            // 有效
                            myFns.clog('[路由守卫] 已登录 > 需要再次核实token有效性 > 查询成功 > 有效')
                            resolve()
                        } else {
                            // 无效
                            myFns.clog('[路由守卫] 已登录 > 需要再次核实token有效性 > 查询成功 > 无效')
                            // 删除token
                            store.commit('updateTokenMutations', '')
                            reject()
                        }
                        
                    }).catch(ce => {
                        // 查询失败
                        myFns.clog('[路由守卫] 已登录 > 需要再次核实token有效性 > 查询失败')
                        reject()
                    })
                }).then((dctoken)=>{
                    myFns.clog('[路由守卫] 已登录 > token有效')
                    // 设置标题
                    if (to.meta.title) {
                        document.title = to.meta.title
                    }
                    next()
                }).catch((e)=>{
                    myFns.clog('[路由守卫] 已登录 > token无效 > 跳转登录页面')
                    next(cp.pageLogin)
                })

            } else {
                // 常规页面，无需重新核实token有效性
                myFns.clog('[路由守卫] 已登录 > 无需核实token有效性')
                // 设置标题
                if (to.meta.title) {
                    document.title = to.meta.title
                }
                next()
            }
        }

    } else if (to.path && cp.pagesWithoutLogin.indexOf(to.path) !== -1) {
        myFns.clog('[路由守卫] 免登录')
        // 设置标题
        if (to.meta.title) {
            document.title = to.meta.title
        }
        next()

    } else {
        myFns.clog('[路由守卫] 未登录 > 需要登录')
        next(cp.pageLogout)
    }
})
